package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumAttributeValueService;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;

	@Autowired
	private AlbumAttributeValueMapper albumAttributeValueMapper;

	@Autowired
	private AlbumStatMapper albumStatMapper;

	@Autowired
	private AlbumAttributeValueService albumAttributeValueService;

	/**
	 * 获取当前用户专辑列表
	 * 添加音频的时候需要获取专辑列表，只需要标题和id。
	 * 直接用mybatisplus中service的list方法虽然可以实现，单查询了太多不需要的列，所以要先解决查询列过多的问题。
	 *    LambdaQueryWrapper<AlbumInfo>()有一个select()方法，可以指定查询的列。
	 * 还有一个问题就是查询返回的数据量太大，导致显示很慢，打开下拉框很卡，所以需要优化。
	 * 改为分页查询，但不需要返回当前页、总条数、页大小等信息。直接返回专辑列表即可。因为这里的分页只是为了优化，并不需要实现分页。
	 * @param userId
	 * @return
	 */
	@Override
	public List<AlbumInfo> findUserAllAlbumList(Long userId) {

		//分页，解决查询数据量过大
		Page<AlbumInfo> page = new Page<>(1, 20);

		//select()解决查询列过多问题
		LambdaQueryWrapper<AlbumInfo> select = new LambdaQueryWrapper<AlbumInfo>()
				.eq(AlbumInfo::getUserId, userId)
				.select(AlbumInfo::getId, AlbumInfo::getAlbumTitle)
				.orderByDesc(AlbumInfo::getId);
		Page<AlbumInfo> albumInfoPage = albumInfoMapper.selectPage(page, select);
		return albumInfoPage.getRecords();
	}

	/**
	 * 更新专辑信息
	 * @param id
	 * @param albumInfoVo
	 */
	@Transactional(rollbackFor = Exception.class)
	@Override
	public void updateAlbumInfo(Long id, AlbumInfoVo albumInfoVo) {


		AlbumInfo albumInfo = new AlbumInfo();
		BeanUtils.copyProperties(albumInfoVo, albumInfo);
		albumInfo.setId(id);
		albumInfoMapper.updateById(albumInfo);


		//修改专辑对应的属性和属性值表，先删除在添加
		albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>()
				.eq(AlbumAttributeValue::getAlbumId, id));


		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		//	判断
		if (!CollectionUtils.isEmpty(albumAttributeValueVoList)) {
			//	循环遍历。
			List<AlbumAttributeValue> attributeValueList = albumAttributeValueVoList.stream().map(albumAttributeValueVo -> {
				//	创建对象
				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
				//	赋值
				/*albumAttributeValue.setAlbumId(albumInfo.getId());
				albumAttributeValue.setAttributeId(albumAttributeValueVo.getAttributeId());
				albumAttributeValue.setValueId(albumAttributeValueVo.getValueId());*/
				BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
				albumAttributeValue.setAlbumId(id);
				//	返回对象
				return albumAttributeValue;
			}).collect(Collectors.toList());

			albumAttributeValueService.saveBatch(attributeValueList);
		}

	}

	/**
	 * 根据专辑id回显数据
	 * @param id
	 * @return
	 */
	@Override
	public AlbumInfo getAlbumInfo(Long id) {
		return albumInfoMapper.selectAlbumInfoById(id);
	}

	/**
	 * 根据专辑id删除专辑信息
	 * @param id
	 */
	@Transactional(rollbackFor = Exception.class)
	@Override
	public void removeAlbumInfo(Long id) {
		//删除专辑信息跟保存对应，需要删除三张表中的数据。另外两张表都有外键专辑Id
		albumInfoMapper.deleteById(id);
		albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>()
				.eq(AlbumAttributeValue::getAlbumId,id));
		albumStatMapper.delete(new LambdaQueryWrapper<AlbumStat>()
				.eq(AlbumStat::getAlbumId,id));
	}

	/**
	 * 根据用户Id查专辑相关信息
	 * @param albumListVoPage
	 * @param albumInfoQuery
	 * @return
	 */
	@Override
	public IPage<AlbumListVo> findUserAlbumPage(Page<AlbumListVo> albumListVoPage, AlbumInfoQuery albumInfoQuery) {
		return  albumInfoMapper.selectUserAlbumPage(albumListVoPage,albumInfoQuery);

	}

	/**
	 * 保存专辑
	 * @param albumInfoVo
	 * @param userId
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public void saveAlbumInfo(AlbumInfoVo albumInfoVo,Long userId) {
		//保存专辑信息需要保存三张表
		AlbumInfo albumInfo=new AlbumInfo();
		albumInfo.setUserId(userId);
		albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
		//如果是付费前五集试看
		if(!albumInfoVo.getPayType().equals(SystemConstant.ALBUM_PAY_TYPE_FREE)){
			albumInfo.setTracksForFree(5);
		}
		BeanUtils.copyProperties(albumInfoVo,albumInfo);
		albumInfoMapper.insert(albumInfo);


		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		if(!CollectionUtils.isEmpty(albumAttributeValueVoList)){
			albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> {
				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
				BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
				albumAttributeValue.setAlbumId(albumInfo.getId());
				//	保存数据
				albumAttributeValueMapper.insert(albumAttributeValue);
			});
		}


		//添加统计数据
		//播放量
		saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_PLAY);
		//订阅
		saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_SUBSCRIBE);
		//购买
		saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_BROWSE);
		//评论
		saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_COMMENT);


	}

	private void saveAlbumStat(Long albumId,String statType) {
		AlbumStat albumStat=new AlbumStat();
		albumStat.setAlbumId(albumId);
		albumStat.setStatType(statType);
		albumStat.setStatNum(0);
		albumStatMapper.insert(albumStat);
	}

	public void method(){}



}
